/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
/*
将所有链表的元素都放在优先队列中，按从小到大，创建小根堆。
依次从优先队列中取出一个最小的元素，按尾插法的方式建立链表
*/
struct cmp
{
    bool operator()(ListNode*a,ListNode*b)
    {
        return a->val>b->val;
    }
};
class Solution {
public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
         /*元素的类型；容器；比较方式*/
        priority_queue<ListNode*,vector<ListNode*>,cmp>q;
        //将所有元素都放入优先队列中，lists里面放的是每一根链表的头结点
        for(ListNode*&x:lists)
        {
            while(x!=nullptr)
            {
                q.push(x);
                x=x->next;
            }
        }
        ListNode *ans=new ListNode(0);
        ListNode *head=ans;
        while(!q.empty())
        {
            ans->next=new ListNode(q.top()->val);
            ans=ans->next;
            q.pop();
        }
        return head->next;
    }
};